home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-04-03 | 17.2 KB | 573 lines | [TEXT/MPS ] |
- //----------------------------------------------------------------------------------------
- // UBehavior.cp
- // Copyright © 1991-96 by Apple Computer, Inc. All rights reserved.
- //----------------------------------------------------------------------------------------
-
- #ifndef __UBEHAVIOR__
- #include "UBehavior.h"
- #endif
-
- // MacApp
-
- #ifndef __UCOREGLOBALS__
- #include "UCoreGlobals.h"
- #endif
-
- #ifndef __UOBJECT__
- #include "UObject.h"
- #endif
-
- #ifndef __USTREAM__
- #include "UStream.h"
- #endif
-
-
- //========================================================================================
- // CLASS TBehavior
- //========================================================================================
-
- #undef Inherited
- #define Inherited TObject
-
- #pragma segment MAOpen
- MA_DEFINE_CLASS_M1(TBehavior,
- Inherited);
-
- //----------------------------------------------------------------------------------------
- // TBehavior constructor
- //----------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- TBehavior::TBehavior() :
- fOwner(NULL),
- fNextBehavior(NULL),
- fPreviousBehavior(NULL),
- fIdentifier(kNoIdentifier),
- fIdleFreq(kMaxIdleTime),
- // Assume it never wants idle time
- fLastIdle(0),
- fEnabled(TRUE),
- fIsOwnerSelected(FALSE)
- {
- }
- // TBehavior::TBehavior
-
- //----------------------------------------------------------------------------------------
- // TBehavior::IBehavior:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- void TBehavior::IBehavior(IDType itsIdentifier)
- {
- IObject();
-
- fIdentifier = itsIdentifier;
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::Clone:
- //----------------------------------------------------------------------------------------
- #pragma segment MABehaviorNonRes
-
- TObject* TBehavior::Clone() // Override
- {
- TBehavior * aClonedBehavior = (TBehavior *)(Inherited::Clone());
-
- aClonedBehavior->fNextBehavior = NULL;
- aClonedBehavior->fOwner = NULL;
- aClonedBehavior->fPreviousBehavior = NULL;
-
- return aClonedBehavior;
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::Free:
- //----------------------------------------------------------------------------------------
- #pragma segment MAClose
-
- TBehavior::~TBehavior()
- {
- fNextBehavior = (TBehavior *)FreeIfObject(fNextBehavior);
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::ReadFrom:
- //----------------------------------------------------------------------------------------
- #pragma segment MAReadResource
-
- void TBehavior::ReadFrom(TStream* aStream) // Override
- {
- Inherited::ReadFrom(aStream);
-
- fIdentifier = aStream->ReadIDType();
- fEnabled = aStream->ReadBoolean();
- fIdleFreq = aStream->ReadLong();
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::WriteTo:
- //----------------------------------------------------------------------------------------
- #pragma segment MAWriteResource
-
- void TBehavior::WriteTo(TStream* aStream) // Override
- {
- Inherited::WriteTo(aStream);
-
- aStream->WriteIDType(fIdentifier);
- aStream->WriteBoolean(fEnabled);
- aStream->WriteLong(fIdleFreq);
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::AppendBehavior:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- void TBehavior::AppendBehavior(TBehavior* aBehavior)
- {
- if (aBehavior)
- {
- if (fNextBehavior)
- fNextBehavior->AppendBehavior(aBehavior);
- else
- {
- SetNextBehavior(aBehavior);
- aBehavior->SetPreviousBehavior(this);
- }
- }
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::SetOwner:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- void TBehavior::SetOwner(TEventHandler* itsOwner)
- {
- fOwner = itsOwner;
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::SelectOwner:
- //----------------------------------------------------------------------------------------
- #pragma segment MABehaviorNonRes
-
- void TBehavior::SelectOwner(Boolean select)
- {
- fIsOwnerSelected = select;
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::SetEnabled:
- //----------------------------------------------------------------------------------------
- #pragma segment MABehaviorRes
-
- void TBehavior::SetEnabled(Boolean enabled)
- {
- fEnabled = enabled;
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::GetNextEnabledBehavior:
- //----------------------------------------------------------------------------------------
- #pragma segment MABehaviorRes
-
- TBehavior* TBehavior::GetNextEnabledBehavior() const
- {
- return fNextBehavior ? (fNextBehavior->IsEnabled() ? fNextBehavior : fNextBehavior->GetNextEnabledBehavior()) : NULL;
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::InsertBefore:
- //----------------------------------------------------------------------------------------
- #pragma segment MABehaviorNonRes
-
- void TBehavior::InsertBefore(TBehavior* insertMe,
- TBehavior* before)
- {
- if (insertMe)
- {
- // We are one that insertion is going to be before
- if (this == before)
- {
- if (fPreviousBehavior)
- fPreviousBehavior->SetNextBehavior(insertMe);
-
- insertMe->SetPreviousBehavior(fPreviousBehavior);
- insertMe->SetNextBehavior(this);
-
- SetPreviousBehavior(insertMe);
- }
- else if (fNextBehavior) // Pass message on down chain
- fNextBehavior->InsertBefore(insertMe, before);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::InsertAfter:
- //----------------------------------------------------------------------------------------
- #pragma segment MABehaviorNonRes
-
- void TBehavior::InsertAfter(TBehavior* insertMe,
- TBehavior* after)
- {
- if (insertMe)
- {
- // We are one that insertion is going to be after
- if (this == after)
- {
- TBehavior * nextBehavior = GetNextBehavior();
-
- insertMe->SetPreviousBehavior(this);
- insertMe->SetNextBehavior(nextBehavior);
-
- if (nextBehavior)
- nextBehavior->SetPreviousBehavior(insertMe);
-
- SetNextBehavior(insertMe);
- }
- else if (fNextBehavior) // Pass message on down chain
- fNextBehavior->InsertAfter(insertMe, after);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::RemoveBehavior:
- //----------------------------------------------------------------------------------------
- #pragma segment MABehaviorNonRes
-
- void TBehavior::RemoveBehavior(TBehavior* removeMe)
- {
- // We are the one being removed
- if (this == removeMe)
- {
- TBehavior * itsNextBehavior = GetNextBehavior();
-
- if (fPreviousBehavior)
- fPreviousBehavior->SetNextBehavior(itsNextBehavior);
-
- if (itsNextBehavior)
- itsNextBehavior->SetPreviousBehavior(fPreviousBehavior);
-
- // remove it from the linked list
- SetNextBehavior(NULL);
- SetPreviousBehavior(NULL);
- SetOwner(NULL);
- }
- else if (fNextBehavior) // Pass message on down chain as we aren't one to be removed
- fNextBehavior->RemoveBehavior(removeMe);
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::DoCommandKeyEvent:
- //----------------------------------------------------------------------------------------
- #pragma segment MASelCommand
-
- void TBehavior::DoCommandKeyEvent(TToolboxEvent* event)
- {
- TBehavior * nextBehavior = GetNextEnabledBehavior();
-
- if (nextBehavior)
- nextBehavior->DoCommandKeyEvent(event);
- else if (fOwner)
- fOwner->DoCommandKeyEvent(event);
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::DoEvent:
- //----------------------------------------------------------------------------------------
- #pragma segment MABehaviorRes
-
- void TBehavior::DoEvent(EventNumber eventNumber,
- TEventHandler* source,
- TEvent* event)
- {
- TBehavior * nextBehavior = GetNextEnabledBehavior();
-
- if (nextBehavior)
- nextBehavior->DoEvent(eventNumber, source, event);
- else if (fOwner)
- fOwner->DoEvent(eventNumber, source, event);
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::DoKeyEvent:
- //----------------------------------------------------------------------------------------
- #pragma segment MASelCommand
-
- void TBehavior::DoKeyEvent(TToolboxEvent* event)
- {
- TBehavior * nextBehavior = GetNextEnabledBehavior();
-
- if (nextBehavior)
- nextBehavior->DoKeyEvent(event);
- else if (fOwner)
- fOwner->DoKeyEvent(event);
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::DoKeyUp:
- //----------------------------------------------------------------------------------------
- #pragma segment MASelCommand
-
- void TBehavior::DoKeyUp(TToolboxEvent* event)
- {
- TBehavior * nextBehavior = GetNextEnabledBehavior();
-
- if (nextBehavior)
- nextBehavior->DoKeyUp(event);
- else if (fOwner)
- fOwner->DoKeyUp(event);
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::DoMenuCommand:
- //----------------------------------------------------------------------------------------
- #pragma segment MASelCommand
-
- void TBehavior::DoMenuCommand(CommandNumber aCommandNumber)
- {
- TBehavior * nextBehavior = GetNextEnabledBehavior();
-
- if (nextBehavior)
- nextBehavior->DoMenuCommand(aCommandNumber);
- else if (fOwner)
- fOwner->DoMenuCommand(aCommandNumber);
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::DoScriptCommand:
- //----------------------------------------------------------------------------------------
- #pragma segment MASelCommand
-
- Boolean TBehavior::DoScriptCommand(CommandNumber aCommandNumber,
- TAppleEvent* message,
- TAppleEvent* reply)
- {
- TBehavior * nextBehavior = GetNextEnabledBehavior();
-
- return nextBehavior ? nextBehavior->DoScriptCommand(aCommandNumber, message, reply) : FALSE;
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::DoSetupMenus:
- //----------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- void TBehavior::DoSetupMenus()
- {
- TBehavior * nextBehavior = GetNextEnabledBehavior();
-
- if (nextBehavior)
- nextBehavior->DoSetupMenus();
- else if (fOwner)
- fOwner->DoSetupMenus();
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::DoBehaviorUpdate:
- //----------------------------------------------------------------------------------------
- #pragma segment MAObjectRes
-
- void TBehavior::DoBehaviorUpdate(ChangeID theChange,
- TObject* changedObject,
- TObject* changedBy,
- TDependencySpace* dependencySpace)
- {
- TBehavior * nextBehavior = GetNextEnabledBehavior();
-
- if (nextBehavior)
- nextBehavior->DoBehaviorUpdate(theChange, changedObject, changedBy, dependencySpace);
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::NextIdle:
- //----------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- long TBehavior::NextIdle()
- {
- long returnVal = kMaxIdleTime;
-
- if ((fIdleFreq != kMaxIdleTime) && IsEnabled())// Does it idle at all?
- {
- if (fLastIdle == 0) // if never idled then it needs idling now
- returnVal = TickCount();
- else
- returnVal = fLastIdle + fIdleFreq;
- }
-
- return returnVal;
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::HandleIdle:
- //----------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- void TBehavior::HandleIdle(IdlePhase phase)
- {
- TBehavior * nextBehavior = GetNextEnabledBehavior();// Do first, because 'this'
- // may be freed by DoIdle
-
- if ((fIdleFreq != kMaxIdleTime) && IsEnabled())// Does it idle at all?
- {
- // idleBegin and idleEnd don't respect fIdleFreq because they are
- // notifications that the application is beginning/ending idle.
- // idleContinues, however, are parceled out at the fIdleFreq.
-
- if ((phase != idleContinue) || (TickCount() - fLastIdle >= fIdleFreq))
- {
- // don't store the fLastIdle if I FREE'd myself or
- // the idlePhase is not idleContinue
- if (!(DoIdle(phase)) && (phase == idleContinue))
- fLastIdle = TickCount();
- }
- }
-
- if (nextBehavior)
- nextBehavior->HandleIdle(phase);
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::DoIdle:
- //----------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- Boolean TBehavior::DoIdle(IdlePhase)
- {
- return FALSE; // Did not free myself
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::SetIdleFreq:
- //----------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- void TBehavior::SetIdleFreq(long newIdleFreq)
- {
- fIdleFreq = newIdleFreq;
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::DoMouseCommand:
- //----------------------------------------------------------------------------------------
- #pragma segment MASelCommand
-
- Boolean TBehavior::DoMouseCommand(VPoint& theMouse,
- TToolboxEvent* event,
- CPoint hysteresis)
- {
- TBehavior * nextBehavior = GetNextEnabledBehavior();
-
- return nextBehavior ? nextBehavior->DoMouseCommand(theMouse, event, hysteresis) : FALSE;
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::DoMouseUp:
- //----------------------------------------------------------------------------------------
- #pragma segment MASelCommand
-
- Boolean TBehavior::DoMouseUp(VPoint& theMouse,
- TToolboxEvent* event,
- CPoint hysteresis)
- {
- TBehavior * nextBehavior = GetNextEnabledBehavior();
-
- return nextBehavior ? nextBehavior->DoMouseUp(theMouse, event, hysteresis) : FALSE;
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::Draw:
- //----------------------------------------------------------------------------------------
- #pragma segment MABehaviorRes
-
- void TBehavior::Draw(const VRect& area)
- {
- TBehavior * nextBehavior = GetNextEnabledBehavior();
-
- if (nextBehavior)
- nextBehavior->Draw(area);
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::DoSetCursor:
- //----------------------------------------------------------------------------------------
- #pragma segment MABehaviorRes
-
- Boolean TBehavior::DoSetCursor(const VPoint& localPoint,
- RgnHandle cursorRegion)
- {
- TBehavior * nextBehavior = GetNextEnabledBehavior();
-
- return nextBehavior ? nextBehavior->DoSetCursor(localPoint, cursorRegion) : FALSE;
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::DoToolboxEvent:
- //----------------------------------------------------------------------------------------
- #pragma segment MABehaviorRes
-
- Boolean TBehavior::DoToolboxEvent(TToolboxEvent* event)
- {
- TBehavior * nextBehavior = GetNextEnabledBehavior();
-
- return nextBehavior ? nextBehavior->DoToolboxEvent(event) : FALSE;
- }
-
- //----------------------------------------------------------------------------------------
- // TBehavior::DoPostCreate:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- void TBehavior::DoPostCreate(TDocument* itsDocument)
- {
- TBehavior * nextBehavior = GetNextEnabledBehavior();
-
- if (nextBehavior)
- nextBehavior->DoPostCreate(itsDocument);
- }
-
- //========================================================================================
- // CLASS CBehaviorIterator
- //========================================================================================
-
- #undef Inherited
- #define Inherited CIterator
-
- //----------------------------------------------------------------------------------------
- // CBehaviorIterator::Advance:
- //----------------------------------------------------------------------------------------
- #pragma segment MABehaviorRes
-
- void CBehaviorIterator::Advance()
- {
- fCurrentBehavior = fNextBehavior;
- if (fCurrentBehavior)
- fNextBehavior = fCurrentBehavior->GetNextBehavior();
- }
-
- //----------------------------------------------------------------------------------------
- // CBehaviorIterator::CBehaviorIterator.
- //----------------------------------------------------------------------------------------
- #pragma segment MABehaviorRes
-
- CBehaviorIterator::CBehaviorIterator(TEventHandler* itsEventHandler) :
- fFirstBehavior(NULL),
- fCurrentBehavior(NULL),
- fNextBehavior(NULL)
- {
- if (itsEventHandler)
- {
- fFirstBehavior = itsEventHandler->fBehavior;
- fCurrentBehavior = fFirstBehavior;
- if (fFirstBehavior)
- fNextBehavior = fFirstBehavior->GetNextBehavior();
- }
- }
-
- //----------------------------------------------------------------------------------------
- // End of UBehavior.cp
-
- #pragma segment Inline
-